/*
 * Copyright (c) 2012 ASINFO (Asesores Informaticos), todos los derechos
 * reservados. Este software es confidencial y su informacion es propiedad de
 * ASINFO(Asesores Informaticos). No debe revelar tal informacion y debe usarla
 * unicamente de acorde con los terminos de uso.
 */

package ec.linde.modulos.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import ec.linde.persistencia.entidades.ProdCabeceraProforma;
import ec.linde.persistencia.entidades.ProdClientes;
import ec.linde.persistencia.entidades.ProdConceptos;
import ec.linde.persistencia.entidades.ProdPartidaDetalle;
import ec.linde.persistencia.entidades.ProdSucursales;
import ec.linde.persistencia.entidades.SeadUsuarios;

/**
 * TODO: Agregar descripcion
 * 
 * FechaCreacion: 10/10/2014
 * 
 * @author: Alex Carrillo
 * @version: 1.0
 */
@Stateless
public class DatosBaseProyectosDao {

	@PersistenceContext(unitName = "productividadJPA")
	public static EntityManager em;

	/**
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @param id
	 * @return
	 */
	public ProdClientes buscarClientePorId(int id) {
		return em.find(ProdClientes.class, id);
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @param id
	 * @return
	 */
	public SeadUsuarios buscarUsuarioPorId(int id) {
		return em.find(SeadUsuarios.class, id);
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @param id
	 * @return
	 */
	public ProdSucursales buscarSucursalPorId(int id) {
		return em.find(ProdSucursales.class, id);
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @param id
	 * @return
	 */
	public ProdCabeceraProforma buscarProformaPorId(int id) {
		return em.find(ProdCabeceraProforma.class, id);
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @param id
	 * @return
	 */
	public ProdConceptos buscarConceptoPorId(int id) {
		return em.find(ProdConceptos.class, id);
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @param id
	 * @return
	 */
	public ProdPartidaDetalle buscarPartidaPorId(int id) {
		return em.find(ProdPartidaDetalle.class, id);
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<SeadUsuarios> getObtenerUsuarios() {
		return em.createQuery(" SELECT u FROM SeadUsuarios u ORDER BY u.usuaApellidos ").getResultList();
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<ProdSucursales> getObtenerSucucursal() {
		return em.createQuery(" SELECT s FROM ProdSucursales s ORDER BY s.sucuDescripcion ").getResultList();
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<ProdClientes> getObtenerClientes() {
		return em.createQuery(" SELECT c FROM ProdClientes c ORDER BY c.clieNombre ").getResultList();
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<ProdConceptos> getObtenerConceptos() {
		return em.createQuery(" SELECT c FROM ProdConceptos c ORDER BY c.concNombre ").getResultList();
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<ProdPartidaDetalle> getObtenerPartidas(ProdCabeceraProforma prodCabeceraProforma) {

		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT p FROM ProdPartidaDetalle p ");
		sql.append(" WHERE p.prodCabeceraProforma=:prodCabeceraProforma ");
		sql.append(" ORDER BY p.padeNombre ");

		Query query = em.createQuery(sql.toString());
		query.setParameter("prodCabeceraProforma", prodCabeceraProforma);

		return query.getResultList();
	}

	/**
	 * TODO: Agregar descripcion del metodo
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<ProdCabeceraProforma> getObtenerProformas() {
		return em.createQuery(" SELECT p FROM ProdCabeceraProforma p ").getResultList();
	}

	public ProdCabeceraProforma cargarDetalleProforma(int idProforma) {

		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT pr FROM   ProdCabeceraProforma pr ");
		sql.append(" LEFT  JOIN FETCH pr.seadUsuarios    li ");
		sql.append(" LEFT  JOIN FETCH pr.prodClientes    cl ");
		sql.append(" LEFT  JOIN FETCH pr.prodPersonas    rc ");
		sql.append(" LEFT  JOIN FETCH pr.prodEstados     es ");
		sql.append(" WHERE pr.caprId = :idProforma");

		Query query = em.createQuery(sql.toString());
		query.setParameter("idProforma", idProforma);

		return (ProdCabeceraProforma) query.getSingleResult();

	}

	@SuppressWarnings("unchecked")
	public List<ProdCabeceraProforma> obtenerListaPorPaginaProformas(int startIndex, int pageSize, String sortField, Map<String, String> filter) {

		Map<String, String> hmParametros = new HashMap<String, String>();

		String filterValue = null;
		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT pr FROM ProdCabeceraProforma pr ");
		sql.append(" LEFT  JOIN FETCH pr.seadUsuarios    li ");
		sql.append(" LEFT  JOIN FETCH pr.prodClientes    cl ");
		sql.append(" LEFT  JOIN FETCH pr.prodPersonas    rc ");
		sql.append(" LEFT  JOIN FETCH pr.prodEstados     es ");
		sql.append(" WHERE 0=0 ");
		sql.append(" AND es.estaId IN (2,3) ");
		sql.append(" AND pr.caprTipoOperacion = '1' ");

		if (filter != null) {

			int i = 1;
			String parametro = "parametro";
			for (String filterProperty : filter.keySet()) {
				
				if (filterProperty.equals("caprCodDkP")) {
					hmParametros.put(parametro + i, filter.get(filterProperty));
					sql.append(" AND pr.caprCodDkP LIKE :" + parametro + i);
					i++;
				}
				if (filterProperty.equals("caprCodOferta")) {
					hmParametros.put(parametro + i, filter.get(filterProperty));
					sql.append(" AND pr.caprCodOferta LIKE :" + parametro + i);
					i++;
				}
				if (filterProperty.equals("seadUsuarios.usuaApellidos")) {
					hmParametros.put(parametro + i, filter.get(filterProperty));
					sql.append(" AND li.usuaApellidos LIKE :" + parametro + i);
					i++;
				}
				if (filterProperty.equals("prodClientes.clieNombre")) {
					hmParametros.put(parametro + i, filter.get(filterProperty));
					sql.append(" AND cl.clieNombre LIKE :" + parametro + i);
					i++;
				}
				if (filterProperty.equals("prodPersonas.persNombre")) {
					hmParametros.put(parametro + i, filter.get(filterProperty));
					sql.append(" AND rc.persNombre LIKE :" + parametro + i);
					i++;
				}

			}
		}

		Query query = em.createQuery(sql.toString());

		for (String parametro : hmParametros.keySet()) {
			filterValue = hmParametros.get(parametro);
			query.setParameter(parametro, "%" + filterValue + "%");
		}
		query.setFirstResult(startIndex);
		query.setMaxResults(pageSize);

		return query.getResultList();
	}

	/**
	 * Retorna el numero de registros dado un criterio
	 * 
	 * @param filters
	 * @return
	 */
	public int contarPorCriterioProforma(Map<String, String> filter) {

		Map<String, String> hmParametros = new HashMap<String, String>();

		String filterValue = null;
		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT COUNT(pr) FROM ProdCabeceraProforma pr ");
		sql.append(" LEFT  JOIN pr.seadUsuarios    li ");
		sql.append(" LEFT  JOIN pr.prodClientes    cl ");
		sql.append(" LEFT  JOIN pr.prodPersonas    rc ");
		sql.append(" RIGHT JOIN pr.prodEstados     es ");
		sql.append(" WHERE 0=0 ");

		// if (filter != null) {
		//
		// int i = 1;
		// String parametro = "parametro";
		// for (String filterProperty : filter.keySet()) {
		// if (filterProperty.equals("prodEstados.estaDescripcion")) {
		// hmParametros.put(parametro + i, filter.get(filterProperty));
		// sql.append(" AND es.estaDescripcion LIKE :" + parametro + i);
		// i++;
		// }
		//
		// if (filterProperty.equals("caprTipoOperacion")) {
		// hmParametros.put(parametro + i, filter.get(filterProperty));
		// sql.append(" AND pr.caprTipoOperacion LIKE :" + parametro + i);
		// i++;
		// }
		// if (filterProperty.equals("proyecto.numero")) {
		// hmParametros.put(parametro + i, filter.get(filterProperty));
		// sql.append(" AND py.numero LIKE :" + parametro + i);
		// i++;
		// }
		// if (filterProperty.equals("proyecto.nombre")) {
		// hmParametros.put(parametro + i, filter.get(filterProperty));
		// sql.append(" AND py.nombre LIKE :" + parametro + i);
		// i++;
		// }
		// if (filterProperty.equals("proyecto.usuario.usuaApellidos")) {
		// hmParametros.put(parametro + i, filter.get(filterProperty));
		// sql.append(" AND li.usuaApellidos LIKE :" + parametro + i);
		// i++;
		// }
		// if (filterProperty.equals("proyecto.ordenTrabajo")) {
		// hmParametros.put(parametro + i, filter.get(filterProperty));
		// sql.append(" AND py.ordenTrabajo LIKE :" + parametro + i);
		// i++;
		// }
		// if (filterProperty.equals("proyecto.persona.persNombre")) {
		// hmParametros.put(parametro + i, filter.get(filterProperty));
		// sql.append(" AND py.ordenTrabajo LIKE :" + parametro + i);
		// i++;
		// }
		// if (filterProperty.equals("proyecto.cliente.clieNombre")) {
		// hmParametros.put(parametro + i, filter.get(filterProperty));
		// sql.append(" AND cl.clieNombre LIKE :" + parametro + i);
		// i++;
		// }
		// if (filterProperty.equals("proyecto.contratista.nombre")) {
		// hmParametros.put(parametro + i, filter.get(filterProperty));
		// sql.append(" AND co.nombre LIKE :" + parametro + i);
		// i++;
		// }
		// if (filterProperty.equals("proyecto.descripcion")) {
		// hmParametros.put(parametro + i, filter.get(filterProperty));
		// sql.append(" AND py.descripcion LIKE :" + parametro + i);
		// i++;
		// }
		//
		// }
		// }
		//
		Query query = em.createQuery(sql.toString());
		//
		// for (String parametro : hmParametros.keySet()) {
		// filterValue = hmParametros.get(parametro);
		// query.setParameter(parametro, "%" + filterValue + "%");
		// }

		return ((Long) query.getSingleResult()).intValue();

	}

	public void guardar(ProdPartidaDetalle partida) {
		em.persist(partida);
	}

}
